最后一遍-L39-Combination Sum

描述:


Given an array of distinct integers candidates and a target integer target, 
return a list of all unique combinations of candidates where the chosen numbers sum to target. 
You may return the combinations in any order.

The same number may be chosen from candidates an unlimited number of times. 
Two combinations are unique if the frequency of at least one of the chosen numbers is different.

The test cases are generated such that the number of unique combinations 
that sum up to target is less than 150 combinations for the given input.

 
Example 1:

Input: candidates = [2,3,6,7], target = 7
Output: [[2,2,3],[7]]
Explanation:
2 and 3 are candidates, and 2 + 2 + 3 = 7. Note that 2 can be used multiple times.
7 is a candidate, and 7 = 7.
These are the only two combinations.
Example 2:

Input: candidates = [2,3,5], target = 8
Output: [[2,2,2,2],[2,3,3],[3,5]]
Example 3:

Input: candidates = [2], target = 1
Output: []
 

Constraints:

1 <= candidates.length <= 30
2 <= candidates[i] <= 40
All elements of candidates are distinct.
1 <= target <= 500

典型的回溯剪枝的写法,借鉴L37

package accumulate.backtracking;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class L39 {
    public static void main(String[] args) {
        System.out.println("Keep Moving! ");

        List<List<Integer>> result = combinationSum(new int[]{2,3,6,7},7);
        for (List tmp : result) {
            System.out.println(Arrays.toString(tmp.toArray()));
        }

        result = combinationSum(new int[]{2,3,5},8);
        for (List tmp : result) {
            System.out.println(Arrays.toString(tmp.toArray()));
        }

        result = combinationSum(new int[]{2},1);
        for (List tmp : result) {
            System.out.println(Arrays.toString(tmp.toArray()));
        }
    }

    public static List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        combinationSum(candidates,target,result,new ArrayList<Integer>(),0);
        return result;
    }

    private static void combinationSum(int[] candidates, int target, List<List<Integer>> result, ArrayList<Integer> sums,int index) {
        if(index >= candidates.length) return;
        if(target == 0) {
            result.add(new ArrayList<>(sums));
            return;
        }
        for (int i = index; i < candidates.length; i++) {
            if(candidates[i] <= target){
                sums.add(candidates[i]);
                combinationSum(candidates,target-candidates[i],result,sums,i);
                sums.remove(sums.size()-1);
            }
        }
    }
}

Powered by andiHappy and Theme by AndiHappy